xen: credit2: make tickling more deterministic
authorDario Faggioli <dario.faggioli@citrix.com>
Fri, 30 Sep 2016 02:53:39 +0000 (04:53 +0200)
committerGeorge Dunlap <george.dunlap@citrix.com>
Fri, 30 Sep 2016 13:46:36 +0000 (14:46 +0100)
commit069cf39fb1715bc8f43dc3f9b332fe6b6b778611
tree54ecb8c7ccb49f4decc76b82a7c45eaf86224a98
parent9fdd2f3c9ccb5b51c4610eb535d7ae8bc8e27c8a
xen: credit2: make tickling more deterministic

Right now, the following scenario can occurr:
 - upon vcpu v wakeup, v itself is put in the runqueue,
   and pcpu X is tickled;
 - pcpu Y schedules (for whatever reason), sees v in
   the runqueue and picks it up.

This may seem ok (or even a good thing), but it's not.
In fact, if runq_tickle() decided X is where v should
run, it did it for a reason (load distribution, SMT
support, cache hotness, affinity, etc), and we really
should try as hard as possible to stick to that.

Of course, we can't be too strict, or we risk leaving
vcpus in the runqueue while there is available CPU
capacity. So, we only leave v in runqueue --for X to
pick it up-- if we see that X has been tickled and
has not scheduled yet, i.e., it will have a real chance
of actually select and schedule v.

If that is not the case, we schedule it on Y (or, at
least, we consider that), as running somewhere non-ideal
is better than not running at all.

The commit also adds performance counters for each of
the possible situations.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
xen/common/sched_credit2.c
xen/include/xen/perfc_defn.h